/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.servico;

import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.modelo.Banco;
import br.com.foxinline.modelo.Pessoa;
import br.com.foxinline.util.Caracter;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;

/**
 *
 * @author laverson
 */
@Stateless
public class PessoaServico extends ServicoGenerico<Pessoa> {

    @EJB
    BancoServico bancoServico;

    public PessoaServico() {
        super(Pessoa.class);
    }

    @Override
    public void salvar(Pessoa entity) {
        if (entity.getCpf() != null && !entity.getCpf().equals("")) {
            entity.setCpf(Caracter.removecaracter(entity.getCpf()));
        }
        if (entity.getCnpj() != null && !entity.getCnpj().equals("")) {
            entity.setCnpj(Caracter.removecaracter(entity.getCnpj()));
        }
        if (entity.getRg() != null && !entity.getRg().equals("")) {
            entity.setRg(Caracter.removecaracter(entity.getRg()));
        }

        entity = verificarPessoa(entity);

        super.salvar(entity);
    }

    @Override
    public void atualizar(Pessoa entity) {
        if (entity.getCpf() != null && !entity.getCpf().equals("")) {
            entity.setCpf(Caracter.removecaracter(entity.getCpf()));
        }
        if (entity.getCnpj() != null && !entity.getCnpj().equals("")) {
            entity.setCnpj(Caracter.removecaracter(entity.getCnpj()));
        }
        if (entity.getRg() != null && !entity.getRg().equals("")) {
            entity.setRg(Caracter.removecaracter(entity.getRg()));
        }

        super.atualizar(entity);
    }

    /**
     *
     * Limpa os campos que não correspondem ao tipo de documento da entidade
     *
     * @param entity
     * @return entidade
     */
    public Pessoa verificarPessoa(Pessoa entity) {

        if (entity.getTipoDocumento().equals(TipoDocumento.CPF)) {
            entity.setNomeFantasia(null);
        } else {
            entity.setRg(null);
            entity.setCpf(null);
            entity.setNome(null);
            entity.setNomeMae(null);
            entity.setDataNascimento(null);
        }

        entity.setId(null);

        return entity;
    }

    /**
     *
     * @return existProprietario retorna uma pessoa física ou jurídica
     */
    public Pessoa existProprietario(Pessoa pessoa) {
        String doc;

        if (pessoa.getTipoDocumento().equals(TipoDocumento.CPF)) {
            doc = pessoa.getCpf();
        } else {
            doc = pessoa.getCnpj();
        }

        String sql = "Select p from Pessoa p where ";
        if (pessoa.getTipoDocumento().equals(TipoDocumento.CPF)) {
            sql += " lower(p.cpf) ";
        } else {
            sql += " lower(p.cnpj) ";
        }
        sql += " like lower(:doc)";

        doc = Caracter.removecaracter(doc);

        Query query = getEntityManager().createQuery(sql);
        query.setParameter("doc", doc);
        try {
            pessoa = (Pessoa) query.getResultList().get(0);

        } catch (NoResultException nr) {
            return null;
        } catch (NonUniqueResultException nre) {
            return null;
        } catch (Exception e) {
            return null;
        }

        return pessoa;
    }

    /**
     *
     * @param existDocuments verifica se existe do documento e retorna um
     * Proprietario
     */
    public Pessoa existDocuments(Pessoa p) {
        if (p.getCpf() != null && !p.getCpf().equals("")) {
            p.setCpf(Caracter.removecaracter(p.getCpf()));
        }
        if (p.getCnpj() != null && !p.getCnpj().equals("")) {
            p.setCnpj(Caracter.removecaracter(p.getCnpj()));
        }

        Pessoa pe = existProprietario(p);
        if (pe != null) {
            p = pe;
            if (p.getCnpj() != null) {
                p.setTipoDocumento(TipoDocumento.CNPJ);
            } else if (p.getCpf() != null) {
                p.setTipoDocumento(TipoDocumento.CPF);
            }
        } else {

            if (p.getCnpj() != null) {
                String cnpj;
                cnpj = p.getCnpj();
                p = new Pessoa();
                p.setTipoDocumento(TipoDocumento.CNPJ);
                p.setCnpj(cnpj);

            } else if (p.getCpf() != null) {
                String cpf;
                cpf = p.getCpf();
                p = new Pessoa();
                p.setTipoDocumento(TipoDocumento.CPF);
                p.setCpf(cpf);

            }
        }
        return p;
    }

    /**
     *
     * @param typeDocument retorna o tipo de documento
     */
    public String typeDocument(Pessoa p) {
        String document = "";
        if (p.getTipoDocumento() == TipoDocumento.CNPJ) {
            document = p.getCnpj();
        } else if (p.getTipoDocumento() == TipoDocumento.CPF) {
            document = p.getCpf();
        }
        return document;
    }

    /**
     *
     * @param findProprietario pesquisa
     */
    public List<Pessoa> find(Pessoa p, Banco b) {
        String sql = "select p from Pessoa p ";

        p.setCnpj(Caracter.removecaracter(p.getCnpj()));
        p.setCpf(Caracter.removecaracter(p.getCpf()));

        if (b != null) {
            if (b.getAgencia() != null && !b.getAgencia().equals("")
                    || b.getConta() != null && !b.getConta().equals("")
                    || b.getTipoBanco() != null) {
                sql += " JOIN p.bancos b";
            }

        }

        sql += " where ";

        if (b != null) {
            if (b.getAgencia() != null && !b.getAgencia().equals("")) {
                sql += " b.agencia like :agencia and ";
            }
            if (b.getConta() != null && !b.getConta().equals("")) {
                sql += " b.conta like :conta and ";
            }
        }

        if (p.getTipoDocumento() == TipoDocumento.CPF) {
            sql += " p.tipoDocumento = :tipodocumento and ";

            if ((!p.getNome().equals("")) && (p.getNome() != null)) {
                sql += " lower(p.nome) like lower(:name) and ";
            }
            if ((!p.getCpf().equals("")) && (p.getCpf() != null)) {
                sql += " lower(p.cpf) like lower(:cpf) and  ";
            }
        }
        if (p.getTipoDocumento() == TipoDocumento.CNPJ) {
            sql += " p.tipoDocumento = :tipodocumento and ";
            if ((p.getNomeFantasia() != null) && (!p.getNomeFantasia().equals(""))) {
                sql += " lower(p.nomeFantasia) like lower(:name_s) and ";
            }
            if ((p.getCnpj() != null) && (!p.getCnpj().equals(""))) {
                sql += " lower(p.cnpj) like lower(:cnpj) and  ";
            }
        }

        sql += " 1=1 ";

        System.err.println(sql);
        Query query = getEntityManager().createQuery(sql);

        if (p.getTipoDocumento() == TipoDocumento.CPF) {
            query.setParameter("tipodocumento", p.getTipoDocumento());
            if ((!p.getNome().equals("")) && (p.getNome() != null)) {
                query.setParameter("name", "%" + p.getNome().replace(" ", "%") + "%");
            }
            if ((!p.getCpf().equals("")) && (p.getCpf() != null)) {
                query.setParameter("cpf", "%" + p.getCpf() + "%");
            }
        }
        if (p.getTipoDocumento() == TipoDocumento.CNPJ) {
            query.setParameter("tipodocumento", p.getTipoDocumento());
            if ((p.getNomeFantasia() != null) && (!p.getNomeFantasia().equals(""))) {
                query.setParameter("name_s", "%" + p.getNomeFantasia().replace(" ", "%") + "%");
            }
            if ((p.getCnpj() != null) && (!p.getCnpj().equals(""))) {
                query.setParameter("cnpj", "%" + p.getCnpj() + "%");
            }
        }
        if (b != null) {
            if (b.getAgencia() != null && !b.getAgencia().equals("")) {
                query.setParameter("agencia", "%" + b.getAgencia() + "%");
            }
            if (b.getConta() != null && !b.getConta().equals("")) {
                query.setParameter("conta", "%" + b.getConta() + "%");
            }
        }
        return query.getResultList();
    }

    public List<Pessoa> findEmpresas(Integer limit) {
        String sql = "SELECT p FROM Pessoa p WHERE p.tipoDocumento = :cnpj";

        Query query = getEntityManager().createQuery(sql);

        query.setParameter("cnpj", TipoDocumento.CNPJ);

        if (limit != null) {
            query.setMaxResults(limit);
        }

        return query.getResultList();
    }
}
